package com.baofu.paycore.manager.model;

import com.alibaba.dubbo.common.utils.CollectionUtils;
import com.baofu.paycore.common.exception.ValidateException;
import com.baofu.paycore.service.facade.enums.PayCoreErrorCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 充值对象
 *
 * User: LZQ Date: 2016/04/20  Version: 1.0
 */
@Getter
@Setter
@Slf4j
@ToString(callSuper = true)
public class RechargeBO extends PayBaseBO {

    /**
     * 账户号
     */
    private String accountNo;

    /**
     * 业务类型
     */
    private String bizType;

    /**
     * 业务操作类型
     */
    private String subBizType;

    /**
     * 原币币种
     */
    private String sourceCcy;

    /**
     * 原币金额
     */
    private Long sourceAmt;

    /**
     * 汇率
     */
    private BigDecimal rate;

    /**
     * 扩展信息
     */
    private Map<String,String> paymentExt;

    /**
     * 充值资金信息
     */
    private List<RechargeFundBO> rechargeFundBO;

    /**
     * 资金单
     */
    private RechargeBankBO rechargeBankBO;

    /**
     * 外部跳转URL
     */
    private String outPayUrl;

    /**
     * 回调通知地址
     */
    private String returnUrl;

    /**
     * 客户账号
     */
    private String contractNo;

    /**
     * 处理时间
     */
    private Date respDate;

    /**
     * 日志跟踪号
     */
    private String tradeLogId;

    /**
     * 银行响应参数
     */
    private Map<String,String> params;

    /**
     * 商户号
     */
    private String merchantNo;

    /**
     * 银行编码
     */
    private String bankCode;

    /**
     * 银行名称
     */
    private String bankName;

    /**
     * 会计事件
     */
    private String eventNo;

    /**
     * 短信验证码
     */
    private String smsCode;

    /**
     * 模型检查
     */
    @Override
    public void consistencyCheck() {

        if(Objects.isNull(rechargeBankBO)) {
            return;
        }
        long fundAmt = rechargeBankBO.getAmt();

        if (super.getAmt() != fundAmt) {
            log.error("金额校验异常充值金额:{},资金单金额:{}", super.getAmt() , fundAmt);
            throw new ValidateException(PayCoreErrorCode.AMT_IS_NOT_IN_CONFORMITY);
        }
    }

    /**
     * 根据资金单类型从资金明细列表中获取对应的资金明细
     *
     * @param fundType     资金类型
     * @return             资金明细
     */
    public RechargeFundBO getRechargeFund(String fundType) {

        if (!CollectionUtils.isEmpty(rechargeFundBO)) {
            for (RechargeFundBO each : rechargeFundBO) {

                if (StringUtils.equals(fundType, each.getFundType().getCode())) {
                    return each;
                }
            }
        }
        log.error("此类型资金单不存在:{}", fundType);
        return null;
    }

    /**
     * 状态检查
     */
    @Override
    public void checkStatus() {

    }
}
